package cn.dyp.com.changelanguage.fragment;

import android.content.Intent;
import android.content.pm.LabeledIntent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import android.preference.SwitchPreference;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

import java.util.Locale;

import cn.dyp.com.changelanguage.R;

//系统设置Fragment类

/*Perference就是我们常说的偏好设置，首选项设置，可以保存一些数据，例如我们在上一次使用的时候的一些内容，
希望在下一次启动后依然生效，而不需要再进行配置，一般会使用perference键值对的方式来处理。
在android3.0之前，我们一般去继承Preference这个基类去给用户呈现一个可以设置的界面，其中的layout需要自己编写，
今天我们研究的是3.0之后使用碎片技术的首选项配置方法，即使用PreferenceFragement来实现。

PreferenceFragment以一个列表来展示首选项对象的层级关系，这些首选项将自动地保存为SharedPreferences，
使用户可以用他们来进行交互。

所展示的首选项将会遵循系统首选项的视觉风格，通过使用XML文件来创建各个首选项的视图层级会非常简单。
为了从一个XML文件中获取界面，使用addPreferenceFromResource(int)方法。根元素应该使用PreferenceScreen。
PreferenceCategory用于分类，
随后的元素可以指向实际的首选项的子类。在层次结构中随后的PreferenceScreen将导致屏幕分割
 */

/*问题：
语言切换后无法保存，每次重启都会变回英文
 */

public class SettingFragment extends PreferenceFragment implements
        OnPreferenceChangeListener, OnPreferenceClickListener {
    private static final String LANGUAGE = "language";
    private static final String LANGUAGEGROUP = "language_group";

    private EditTextPreference mLanguageETP;

    private RadioGroup mGroup;
    private int mLanguageId;
    private Locale mLocale;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //从一个XML文件中获取界面
        addPreferencesFromResource(R.xml.preference_setting);
        initView();
        setListener();
    }

    /**
     * 初始化控件
     *
     */
    private void initView() {
        mLanguageETP = (EditTextPreference) findPreference(LANGUAGE);
        Resources res = getResources();
        //获取系统的Configuration对象
        Configuration config = res.getConfiguration();
        if (config.locale.equals(Locale.CHINA)) {
            mLanguageETP.setSummary(R.string.chinese);
            mLanguageId = R.id.radio0;
        } else {
            mLanguageETP.setSummary(R.string.english);
            mLanguageId = R.id.radio1;
        }
        mLanguageETP.getSharedPreferences().edit()
                .putInt(LANGUAGEGROUP, mLanguageId).commit();
    }

    /**
     * 设置监听器
     *
     */
    private void setListener() {
        mLanguageETP.setOnPreferenceChangeListener(this);
        mLanguageETP.setOnPreferenceClickListener(this);
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        switch (preference.getKey()) {
            case LANGUAGE:
                setLanguageRadioButton(preference);
                break;
        }
        return true;
    }

    /**
     * 设置选择语言的种类
     */
    private void setLanguageRadioButton(final Preference preference) {
        //获得单选按钮组
        mGroup = (RadioGroup) mLanguageETP.getDialog().findViewById(R.id.radioGroup1);
        mLanguageId = mLanguageETP.getSharedPreferences().getInt(LANGUAGEGROUP, 0);
        mGroup.check(mLanguageId);//单选按钮组默认选中id
        ((RadioButton) mGroup.getChildAt(0)).setText(R.string.chinese);
        ((RadioButton) mGroup.getChildAt(1)).setText(R.string.english);

        mGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (checkedId == R.id.radio0) {
                    mLanguageId = R.id.radio0;
                } else if (checkedId == R.id.radio1) {
                    mLanguageId = R.id.radio1;
                }
            }
        });
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        switch (preference.getKey()) {
            case LANGUAGE:
                // 保存数据
                mLanguageETP.getEditor().putInt(LANGUAGEGROUP, mLanguageId).commit();
                if (mLanguageId == R.id.radio0) {
                    mLocale = Locale.CHINA;
                } else {
                    mLocale = Locale.ENGLISH;
                }
                // 设置Summary的内容
                changeLanguage(mLocale);
                getActivity().finish();
                break;
        }
        return true;
    }

    /**
     * 切换语言
     *
     * @param locale
     *            本地语言的参数
     */
    private void changeLanguage(Locale locale) {
        Resources res = getResources();
        Configuration config = res.getConfiguration();
        config.locale = locale;//设置应用的语言为locale指定的语言
        DisplayMetrics dm = res.getDisplayMetrics();// 获得屏幕参数：主要是分辨率，像素等
        res.updateConfiguration(config, dm);
        getActivity().sendBroadcast(new Intent("language"));//发送广播，重启Activity
    }
}